package com.teach.javafxclient.controller.base;

import com.teach.javafxclient.AppStore;
import com.teach.javafxclient.Globalvar;
import com.teach.javafxclient.MainApplication;
import com.teach.javafxclient.request.DataRequest;
import com.teach.javafxclient.request.DataResponse;
import com.teach.javafxclient.request.HttpRequestUtil;
import com.teach.javafxclient.util.HttpUtil;
import javafx.application.Platform;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Rectangle2D;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
import kong.unirest.HttpResponse;
import kong.unirest.Unirest;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * MainFrameController 登录交互控制类 对应 base/main-frame.fxml
 *  @FXML  属性 对应fxml文件中的
 *  @FXML 方法 对应于fxml文件中的 on***Click的属性
 */
public class MainFrameController {
    @FXML
    public ImageView adminIcon;
    @FXML
    public Label userName;
    @FXML
    public Label userId;
    public Button workBench;
    public Button index;
    public Button settings2;
    public Button index2;
    public Button settings3;
    public Button personalInfo;
    public Button personalInfo2;
    private Map<String,Tab> tabMap = new HashMap<String,Tab>();
    private Map<String,Node> paneMap = new HashMap<String,Node>();
    private Map<String,ToolController> controlMap =new HashMap<String,ToolController>();
    private Button temp;
    @FXML
    private MenuBar menuBar;

    @FXML
    protected TabPane contentTabPane;

    @FXML
    private VBox adminMenu;

    @FXML
    private VBox studentMenu;

    @FXML
    private VBox teacherMenu;

    @FXML
    private AnchorPane root;

    @FXML
    private AnchorPane content;

    @FXML
    private Separator separator;

    @FXML
    private ImageView avatar;

    @FXML
    private Button settings;
    @FXML
    private Button studentManage;
    @FXML
    private Button innovationAndPractice;
    @FXML
    private Button teachManage;
    /**
     * 页面加载对象创建完成初始话方法，页面中控件属性的设置，初始数据显示等初始操作都在这里完成，其他代码都事件处理方法里
     * 系统初始时为没个角色增加了框架已经实现好了基础管理的功能，采用代码显示添加的方法加入，加入完缺省的功能菜单后，通过
     * HttpRequestUtil.request("/api/base/getMenuList",new DataRequest())加载用菜单管理功能，维护的菜单
     * 项目开发过程中，同学可以扩该方法，增肌自己设计的功能菜单，也可以通过菜单管理程序添加菜单，框架自动加载菜单管理维护的菜单，
     * 是新功能扩展
     */
    @FXML
    public void initialize() {
        HttpResponse avatarRes = HttpUtil.get(Globalvar.baseUrl+"/api/users/"+Globalvar.specificId+"/avatar")
                .header("Accept", "application/json") // 设置请求头（如果需要的话）
                .asBytes();
        System.out.println("收到响应");
        System.out.println(avatarRes.getStatus());
        Image img;
        if(avatarRes.getStatus() == 404){
            img = new Image(getClass().getResource("/com/teach/javafxclient/picture/用户-圆.png").toExternalForm());
        }else{
            img = new Image(new ByteArrayInputStream((byte[]) avatarRes.getBody()));
        }
        double wid = Math.min(img.getWidth() , img.getHeight());
        Circle clip = new Circle(avatar.getFitWidth() / 2, avatar.getFitHeight() / 2, Math.min(avatar.getFitWidth() , avatar.getFitHeight()) / 2);
        avatar.setClip(clip);
        Rectangle2D viewport = new Rectangle2D(img.getWidth()/2 - wid/2, img.getHeight()/2 - wid/2, wid, wid);
        avatar.setViewport(viewport);
        avatar.setImage(img);
        if(!Globalvar.userRole.equals("ADMIN")){
            adminIcon.setManaged(false);
            adminIcon.setVisible(false);
        }
        userName.setText(Globalvar.userName);
        userId.setText(String.valueOf(Globalvar.specificId));


//监听窗口，布局发生变化
        MainApplication.mainStage.widthProperty().addListener((observable, oldValue, newValue) -> {
            root.setPrefWidth(newValue.doubleValue());
            content.setPrefWidth(newValue.doubleValue()-262);
            for (String key : paneMap.keySet()) {
                Node node = paneMap.get(key);
                changeFitWidth(node);
            }
        });
        MainApplication.mainStage.heightProperty().addListener((observable, oldValue, newValue) -> {
            root.setPrefHeight(newValue.doubleValue());
            separator.setPrefHeight(newValue.doubleValue());
            content.setPrefHeight(newValue.doubleValue());
            for (String key : paneMap.keySet()) {
                Node node = paneMap.get(key);
                changeFitHeight(node);
            }
        });

        Menu menu;
        MenuItem item;
        String role = Globalvar.userRole;
        System.out.println(role);
        System.out.println(role.length());
        String str = "ADMIN";
        System.out.println(str.length());
        System.out.println(role.equals("ADMIN"));
        //认证角色选择性渲染
        Platform.runLater(() -> {
            if(role.equals("ADMIN")){
                System.out.println("管理");
                studentMenu.setManaged(false);
                studentMenu.setVisible(false);
                teacherMenu.setManaged(false);
                teacherMenu.setVisible(false);
            }
            else if(role.equals("STUDENT")){
                adminMenu.setManaged(false);
                adminMenu.setVisible(false);
                teacherMenu.setManaged(false);
                teacherMenu.setVisible(false);
            }
            else if(role.equals("TEACHER")){
                studentMenu.setManaged(false);
                studentMenu.setVisible(false);
                adminMenu.setManaged(false);
                adminMenu.setVisible(false);
            }
        });
        //设置不同按键切换页面
        studentManage.setOnAction(e -> changeContent("base/student-manage", "学生管理",(Button) e.getSource()));
        innovationAndPractice.setOnAction(e -> changeContent("base/innovation-and-practice", "创新与实践",(Button) e.getSource()));
        teachManage.setOnAction(e ->changeContent("base/course-page","教务管理",(Button) e.getSource()));
        settings.setOnAction(e ->changeContent("base/settings","设置",(Button) e.getSource()));
        workBench.setOnAction(e->changeContent("base/work-bench","工作台",(Button) e.getSource()));
        index.setOnAction(e->changeContent("base/work-bench","首页",(Button) e.getSource()));
        index2.setOnAction(e->changeContent("base/work-bench","首页",(Button) e.getSource()));
        settings2.setOnAction(e ->changeContent("base/settings","设置",(Button) e.getSource()));
        settings3.setOnAction(e ->changeContent("base/settings","设置",(Button) e.getSource()));
        personalInfo.setOnAction(e->changeContent("base/student-info","个人信息",(Button) e.getSource()));
        personalInfo2.setOnAction(e->changeContent("base/student-info","个人信息",(Button) e.getSource()));
    }

    private void changeFitWidth(Node node) {
        if (node instanceof AnchorPane) {
            ((AnchorPane) node).setPrefWidth(content.getPrefWidth());
        } else if (node instanceof BorderPane) {
            ((BorderPane) node).setPrefWidth(content.getPrefWidth());
        } else if (node instanceof VBox) {
            ((VBox) node).setPrefWidth(content.getPrefWidth());
        } else if (node instanceof HBox) {
            ((HBox) node).setPrefWidth(content.getPrefWidth());
            // HBox的高度通常由内容决定，但你可以设置填充、间距等属性
        } else if (node instanceof GridPane) {
            ((GridPane) node).setPrefWidth(content.getPrefWidth());
        } else if (node instanceof StackPane) {
            ((StackPane) node).setPrefWidth(content.getPrefWidth());
        }
    }
    private void changeFitHeight(Node node) {
        if (node instanceof AnchorPane) {
            ((AnchorPane) node).setPrefHeight(content.getPrefHeight());
        } else if (node instanceof BorderPane) {
            ((BorderPane) node).setPrefHeight(content.getPrefHeight());
        } else if (node instanceof VBox) {
            // VBox的高度通常由内容决定，但你可以设置填充、间距等属性
            // 如果需要设置固定高度，可以使用下面的代码
            ((VBox) node).setPrefWidth(content.getPrefWidth());
        } else if (node instanceof HBox) {
            ((HBox) node).setPrefHeight(content.getPrefHeight());
        } else if (node instanceof GridPane) {
            ((GridPane) node).setPrefHeight(content.getPrefHeight());
        } else if (node instanceof StackPane) {
            ((StackPane) node).setPrefHeight(content.getPrefHeight());
        }
        // 其他的布局容器可以根据需要添加
    }

    /**
     * 点击菜单栏中的“退出”菜单，执行onLogoutMenuClick方法 加载登录页面，切换回登录界面
     * @param event
     */
    protected void onLogoutMenuClick(ActionEvent event){
        FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("login-view.fxml"));
        try {
            Scene scene = new Scene(fxmlLoader.load(), 600.0, 506.0);
            MainApplication.resetStage("Login", scene);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 点击菜单栏中的菜单 执行changeContent 在主框架工作区增加和显示一个工作面板
     * @param name  菜单名 name.fxml 对应面板的配置文件
     * @param title 菜单标题 工作区中的TablePane的标题
     */
    protected  void changeContent(String name, String title,Button button) {
        if(temp != null){
            temp.setStyle("-fx-text-fill: black");
        }
        button.setStyle("-fx-text-fill: #670202");
        temp = button;
        Node node;
        Object c;
        node = paneMap.get(name);
        if( node == null) {
            FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource(name + ".fxml"));
            try {
                node = fxmlLoader.load();
                changeFitWidth(node);
                paneMap.put(name, node);
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
            c = fxmlLoader.getController();
            if(c instanceof ToolController) {
                controlMap.put(name,(ToolController)c);
            }
        }
        content.getChildren().clear();
        content.getChildren().add(node);
    }

    public void tabSelectedChanged(Event e) {
        Tab tab = (Tab)e.getSource();
//        System.out.println("Selection changed event for " + tab.getText() +
//                " tab, selected = " + tab.isSelected());
        Node node =tab.getContent();
        Scene scene = node.getScene();
    }

    /**
     * 点击TablePane 标签页 的关闭图标 执行tabOnClosed方法
     * @param e
     */

    public void tabOnClosed(Event e) {
        Tab tab = (Tab)e.getSource();
        String name = tab.getId();
        contentTabPane.getTabs().remove(tab);
        tabMap.remove(name);
    }
    /**
     * ToolController getCurrentToolController() 获取当前显示的面板的控制对象， 如果面板响应编辑菜单中的编辑命名，交互控制需要继承 ToolController， 重写里面的方法
     * @return
     */
    public ToolController getCurrentToolController(){
        Iterator<String> iterator = controlMap.keySet().iterator();
        String name;
        Tab tab;
        while(iterator.hasNext()) {
            name = iterator.next();
            tab = tabMap.get(name);
            if(tab.isSelected()) {
                return controlMap.get(name);
            }
        }
        return null;
    }
    /**
     * 点击编辑菜单中的“新建”菜单，执行doNewCommand方法， 执行当前显示的面板对应的控制类中的doNew()方法
     */
    protected  void doNewCommand(){
        ToolController c = getCurrentToolController();
        if(c == null)
            return;
        c.doNew();
    }
    /**
     * 点击编辑菜单中的“保存”菜单，执行doSaveCommand方法， 执行当前显示的面板对应的控制类中的doSave()方法
     */
    protected  void doSaveCommand(){
        ToolController c = getCurrentToolController();
        if(c == null)
            return;
        c.doSave();
    }
    /**
     * 点击编辑菜单中的“删除”菜单，执行doDeleteCommand方法， 执行当前显示的面板对应的控制类中的doDelete()方法
     */
    protected  void doDeleteCommand(){
        ToolController c = getCurrentToolController();
        if(c == null)
            return;
        c.doDelete();
    }
    /**
     * 点击编辑菜单中的“打印”菜单，执行doPrintCommand方法， 执行当前显示的面板对应的控制类中的doPrint()方法
     */
    protected  void doPrintCommand(){
        ToolController c = getCurrentToolController();
        if(c == null)
            return;
        c.doPrint();
    }
    /**
     * 点击编辑菜单中的“导出”菜单，执行doExportCommand方法， 执行当前显示的面板对应的控制类中的doExport方法
     */
    protected  void doExportCommand(){
        ToolController c = getCurrentToolController();
        if(c == null)
            return;
        c.doExport();
    }
    /**
     * 点击编辑菜单中的“导入”菜单，执行doImportCommand方法， 执行当前显示的面板对应的控制类中的doImport()方法
     */
    protected  void doImportCommand(){
        ToolController c = getCurrentToolController();
        if(c == null)
            return;
        c.doImport();
    }
    /**
     * 点击编辑菜单中的“测试”菜单，执行doTestCommand方法， 执行当前显示的面板对应的控制类中的doImport()方法
     */
    protected  void doTestCommand(){
        ToolController c = getCurrentToolController();
        if(c == null) {
            c= new ToolController(){
            };
        }
        c.doTest();
    }
}
